package com.heo.queue.task;

import java.util.Date;

import org.apache.log4j.Logger;

import com.heo.pub.ServerConfig;
import com.heo.queue.TaskQueue;
import com.heo.util.HttpHelper;

/**
 * 向发起方发消息的回调线程
 */

public class CallBackTaskThread implements Runnable
{
  private static Logger log = Logger.getLogger(SendTaskThread.class);
  private static String THREAD_NAME = "[发送回调消息线程]";
  private static final int SLEEP_TIME = 100;//每次休息100毫秒

  public CallBackTaskThread()
  {

  }

  @Override
  public void run()
  {
    try
    {
      sendCallBackTask();
    }
    catch (Exception e)
    {
      log.error(e.getMessage(), e);
      log.error(THREAD_NAME + "[回调]线程出现严重异常，已退出运行。");
    }
  }

  public void sendCallBackTask() throws Exception
  {
    log.debug(THREAD_NAME + "[回调]线程开始执行。");
    
    CallBackTask callBackTask = null;
    
    while ((callBackTask = TaskQueue.pollCallBackTask()) != null)
    {
      Thread.sleep(SLEEP_TIME);
      String logHeader = "[server]" + THREAD_NAME;
      
      // 判断是否达到间隔重发的时间
      if ((new Date().getTime() - callBackTask.getReSendInfo().getLastSendTime()) < ServerConfig.RESEND_INTERVAL)
      {
        // 没到重发时间，重新进队列排队
        TaskQueue.offerCallBackTask(callBackTask,false);
        continue;
      }

      // 判断重发超时
      if (callBackTask.getReSendInfo().getExpireTime() < new Date().getTime())
      {
        log.debug(logHeader + "[回调]重发请求已超时，已被丢弃。丢弃内容：" + callBackTask.getSendContent());
        continue;
      }
      // 判断重发次数超限
      if (callBackTask.getReSendInfo().getReSendCount() > callBackTask.getReSendInfo().getMaxReSendCount())
      {
        log.debug(logHeader + "[回调]重发请求已达到最大重发次数，已被丢弃。丢弃内容：" + callBackTask.getSendContent());
        continue;
      }

      try
      {
        String sendContent = callBackTask.getSendContent();
        String httpUrl = callBackTask.getHttpUrl();
        String resultStr = HttpHelper.sendHttpPost(httpUrl, sendContent);
        log.debug(logHeader + "[回调]第" + callBackTask.getReSendInfo().getReSendCount() + "次发起设备状态回调请求URL：" + httpUrl + "　[参数内容]" + sendContent + "　[返回结果]" + resultStr);
        
        // 设置发送计数
        callBackTask.setReSend();// 计数器加一，并同时更新上次发送的时间
        
        //这里是同步响应的。所以对方需要马上告诉我是否收到。如果收到就不再重发。
        if (!"success".equalsIgnoreCase(resultStr))
        {
          //进队列重发
          log.debug(logHeader + "[回调]第" + callBackTask.getReSendInfo().getReSendCount() + "次发送失败，进队列重发。");
          TaskQueue.offerCallBackTask(callBackTask,false);
        }
      }
      catch (Exception e)
      {
        boolean result = TaskQueue.offerCallBackTask(callBackTask,false);
        log.error(logHeader + THREAD_NAME + "[回调]发送回调消息异常，重新放入队列发送。进队列结果：" + result);
        log.error(e.getMessage(), e);
      }
    }
    log.debug(THREAD_NAME + "[回调]线程执行完毕。");
  }

}
